import axios from 'axios'
// 导入 store 实例，获取 token
import store from '@/store'
import router from '@/router'

// 创建一个与axios用法完全一致的实例
const request = axios.create({
  // 配置基地址,今后url只需写后半段
  baseURL: "http://www.liulongbin.top:3008"
})

// 定义请求拦截器
// 所有请求发出去之后，达到服务器之前，必须经过请求拦截器
// 场景：做token的统一携带
request.interceptors.request.use(config => {
  // 统一 为请求头写到 Authorization 字段
  // 在发送请求之间做些什么
  // 统一携带token的操作
  // 1.取出token
  const {
    token
  } = store.state.user
  // 2.通过config对象添加到请求头的headers中带给后台
  if (token) {
    config.headers.Authorization = token
  }
  // console.log(request);
  // console.log(config);
  return config
}, error => {
  // 请求错误做些什么
  return Promise.reject(error)
})

// 响应拦截器
// 服务器收到响应，打到浏览器之前，必须经过响应拦截器
request.interceptors.response.use((request) => {
  // 响应状态码为 2xx，3xx 时触发成功的回调，形参中的 response 是“成功的结果”
  // console.log(request);

  return request
}, (error) => {
  console.log(error);
  // 401表示token过期
  if (error.response.status === 401) {
    // 1.清空vuex中的token和用户信息
    store.commit("user/setToken", "")
    store.commit("user/setUserInfo", {})

    // 2.跳转到登录页
    router.replace('/login')
  }
  return Promise.reject(error)
})

// 默认导出,今后谁想发请求,只需要导入request请求即可
export default request
